﻿// 406 先序中序转后序.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>

using namespace std;
/*
* http://oj.daimayuan.top/course/7/problem/821
给你一棵二叉树的先序遍历和中序遍历，请你求出后序遍历。

输入格式
第一行一个整数 n表示二叉树中点的个数，二叉树中点的编号为 1...n。

第二行一个 1...n的排列，表示二叉树的先序遍历。

第三行一个 1...n的排列，表示二叉树的中序遍历。

数据保证给定的先序遍历和中序遍历对应的二叉树存在。

输出格式
输出一行一个 1...n的排列，表示二叉树的后序遍历。

样例输入
4
1 2 3 4
2 1 4 3
样例输出
2 4 3 1
数据规模
对于所有数据，保证 1≤n≤1024
*/

const int N = 1050;
int pre[N];
int in[N];
int post[N]; int postIdx;
int n;

void GetPost(int prel, int prer, int inl, int inr) {
	if (prel > prer) return;
	
	int mididx = -1;
	for (int i = inl; i <= inr; i++) {
		if (in[i] == pre[prel]) {
			mididx = i; break;
		}
	}
	int leftlen = mididx - inl;
	int rightlen = inr - mididx;

	GetPost(prel+1, prel+ leftlen, inl, mididx-1);
	GetPost(prel + leftlen+1, prer, mididx+1, inr);

	post[postIdx++] = pre[prel];
}

int main()
{
	cin >> n;
	for (int i = 0; i < n; i++) { cin >> pre[i]; }
	for (int i = 0; i < n; i++) { cin >> in[i]; }

	GetPost(0,n-1,0,n-1);

	for (int i = 0; i < n; i++) {
		cout << post[i] << " ";
	}

	return 0;
}
 